#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

Status rewrite_clear_SqStack(SqStack *stack) // 为了输出正确的值选择重新编写clear_SqStack函数
{
    while (stack->top != stack->base)
    {
        putchar(*(stack->top));
        stack->top--;
    }
    return OK;
}

void operate(char *start, SElemType *e, SqStack *work, int *count, char Operator)
{
    // 仅使用'['说明
    putchar(*start); // 只是为了输出的更易懂
    printf("=");     // 只是为了输出的更易懂
    putchar(*e);     // 输出左括号'['
    SElemType *d = (SElemType *)malloc(sizeof(SElemType));
    pop(work, d);          // 弹出一个字符作为while的起始条件
    while (*d != Operator) // 在未匹配到对应括号前一直循环
    {
        putchar(*d);  // 输出中间内容
        pop(work, d); // 继续弹出
    }
    putchar(*d);        // 输出右括号
    push(work, *start); // 简化的式子符号放进去
    (*start)++;         // 计数符号更改
    printf("\t------这是第%d步的计算公式\n", (*count)++);
}

int main() // 括号匹配
{
    SqStack *stack = (SqStack *)malloc(sizeof(SqStack));
    InitStack(stack);
    int count = 1;
    char ch = getchar(); // 读取一个字符
    char start = 'a';    // 一个起始符,便于式子更容易理解
    // putchar函数持续读入字符
    // 测试用例(1+2)[(3+4)*1]
    while (ch != EOF)
    {
        push(stack, ch);
        putchar(ch);
        ch = getchar();
    }
    SqStack *work = (SqStack *)malloc(sizeof(SqStack)); // 定义一个工作栈,负责匹配
    InitStack(work);

    while (is_empty(stack) != 1) // 如果不是空
    {
        // 从stack栈里往work里不断加入元素
        SElemType *e = (SElemType *)malloc(sizeof(SElemType));
        pop(stack, e);
        if (*e != '(' && *e != '[') // 没匹配到左括号
        {
            push(work, *e);
        }
        else if (*e == '(') // 匹配到左括号
        {
            operate(&start, e, work, &count, ')');
        }
        else if (*e == '[') // 匹配到左大括号
        {
            // 操作与代码基本和'('情况相同
            // void operate(char *start, SElemType *e, SqStack *work, int *count, char Operator);
            // 因为要修改start和count的值所以必须使用指针,Operator为操作符( ')'或者']' )
            operate(&start, e, work, &count, ']');
        }
        else // 不是括号的其他类型,原封不动放入work栈
        {
            push(work, *e);
        }
    }
    if (is_empty(work) != 1)
    {
        printf("最后进行运算:");
        rewrite_clear_SqStack(work); // 输出最后部分
    }
    return 0;
}